home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene 96
/
Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso
/
misc
/
coding
/
vgacodng
/
part05_a.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-12-15
|
4KB
|
122 lines
{$G+}
program Mode_X;
uses crt;
var x,y,dirx,diry : word;
procedure SetModeX;assembler;
asm
mov ax,13h { Zuerst den normalen Modus 13h per BIOS aktivieren }
int 10h
mov dx,3C4h
mov al,4 { TS-Register 4 anwählen }
out dx,al
inc dx
in al,dx { Aktuellen Registerinhalt holen }
and al,0F7h { Bit 2 setzen, Bit 3 löschen }
or al,4
out dx,al { Werte zurückschreiben }
dec dx
mov ax,0F02h
out dx,ax { Alle Planes selektieren }
mov ax,0A000h { VGA-Segment nach ES }
mov es,ax
xor di,di
xor ax,ax
mov cx,0FFFFh
cld
rep stosw { Bildschirm löschen }
mov dx,3D4h
mov al,14h { CRTC-Register 14h anwählen }
out dx,al
inc dx
in al,dx { Aktuellen Registerinhalt holen }
and al,0BFh { Bit 6 löschen }
out dx,al
dec dx
mov al,17h { CRTC-Register 17h anwählen }
out dx,al
inc dx
in al,dx
or al,40h { Bit 6 setzen }
out dx,al
end;
procedure XPutPixel(x,y:integer;col:byte);assembler;
asm
mov ax,0A000h { VGA-Segment nach ES }
mov es,ax
mov cx,x { X-Koord nach CX }
and cx,3 { Plane bestimmen }
mov ax,1
shl ax,cl { Entsprechendes Bit setzen }
mov ah,al
mov dx,03C4h
mov al,2 { Timing-Sequencer Reg. 2 anwählen }
out dx,ax { Plane setzen }
mov ax,80 { Pixel-Offset bestimmen }
mul y { Offset = y * 80 + x div 4 }
mov di,ax { y * 80 nach DI }
mov ax,x
shr ax,2 { entspricht AX div 4 }
add di,ax { x div 4 dazuzählen }
mov al,col { Farbe nach AL }
mov es:[di],al { Pixel setzen }
end;
procedure XSetStart(Adr:word);assembler;
asm
mov dx,3D4h
mov al,0Ch { CRTC-Register 0Ch }
mov ah,byte ptr Adr + 1 { Bits 15-8 abschicken }
out dx,ax
mov al,0Dh { CRTC-Register 0Dh }
mov ah,byte ptr Adr { Bits 7-0 abschicken }
out dx,ax
end;
procedure XDouble;assembler;
asm
mov dx,3D4h { CRTC-Register 13h anwählen }
mov ax,5013h { auf 80 setzen (doppelte Breite) }
out dx,ax
end;
procedure WaitRetrace;assembler;
asm
mov dx,3DAh
@l1:
in al,dx
and al,08h
jz @l1
@l2:
in al,dx
and al,08h
jz @l2
end;
begin
setmodex; { Mode-X setzen }
xdouble; { 160-Byte Modus einschalten }
for x := 0 to 319 do { Alle 4 Pages mit Müll füllen }
for y := 0 to 799 do xputpixel(x,y,random(256));
x := 1; { Startposition }
y := 160;
dirx := 1;
diry := 160;
repeat
inc(x,dirx); { Bildausschnitt weiterbewegen }
inc(y,diry);
delay(10);
WaitRetrace;
XSetStart(y+x); { Neue Startadresse setzen }
if (x = 80) or (x = 1) then dirx := -dirx;
if (y = 32000) or (y = 160) then diry := -diry;
{ Richtung umkehren, wenn am Rand angekommen }
until keypressed;
readkey;
asm mov ax,3; int 10h end;
end.